home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / mac / source / music4c.sit / Music4C Folder / Sources Folder / ugens.h < prev   
Text File  |  1990-09-09  |  11KB  |  462 lines

  1. /*
  2. * ⌐ Graeme Gerrard 1990
  3. * Faculty of Music, University of Melbourne
  4. * Parkville Victoria 3052 Australia.
  5. *
  6. * ARPANET: grae@murdu.ucs.unimelb.edu.au
  7. * telephone: (613) 344 4127, Fax: (613) 344 5346
  8. */
  9. int yyI1, yyI2, yyI3, yyI4;
  10. double yyA1, yyA2, yyA3, yyA4, yyA5, yyA6;
  11. /*-----------------------------------------------------------------*/
  12.  
  13. #define Mono(output)\
  14. out[loc] += (output)
  15.  
  16. #define Stereo(output, prop)\
  17. out[loc] += (output) * (prop);\
  18. out[loc+1] += (output) * (1.0 - (prop))
  19.  
  20. #define Output(a, b, c, d)\
  21. switch(nchnls) {\
  22.     case 4: out[loc+3] += d;\
  23.     case 3: out[loc+2] += c;\
  24.     case 2: out[loc+1] += b;\
  25.     case 1: out[loc] += a;\
  26. }
  27.  
  28.  
  29.  
  30.  
  31.  
  32. #define Oscil(sig, amp, si, fno, phs)\
  33. /* truncating digital oscillator, negative samp incs ok */\
  34. sig = (amp) * (*(F[(fno)] + ((int)((phs)+1.0))));\
  35. (phs) += (si);\
  36. while ((phs) < 0.0) (phs) += *(F[(fno)]);\
  37. while ((phs) >= (*(F[(fno)]))) (phs) -= *(F[(fno)])
  38.  
  39.  
  40. #define Oscil1(sig, amp, si, fno, phs)\
  41. /* truncating function lookup, samples function once,
  42. *  holds last value if phs exceeds *(F[(fno)]) (i.e. function length) */\
  43. if ((phs) >= *(F[(fno)]))\
  44.     sig = (amp) * *(F[(fno)] + (int)*(F[(fno)]));\
  45. else {\
  46.     if ((phs) <= 0.0 ) sig = (amp) * *(F[(fno)] + 1);\
  47.     else sig = (amp) * *(F[(fno)] + (int)((phs)+1.0));\
  48.     (phs) += (si);\
  49. }
  50.  
  51.  
  52. #define Osci1(sig, amp, si, fno, phs)\
  53. /* interpolating version of Oscil1 */\
  54. if ((phs) >= *(F[(fno)])\
  55.     sig = (amp) * (*(F[(fno)] + (int)*(F[(fno)]));\
  56. else {\
  57.     if ((phs) <= 0.0 ) sig = (amp) * (*(F[(fno)] + 1));\
  58.     else {\
  59.         yyI1 = (phs) + 1.0;\
  60.         yyI2 = yyI1 + 1;\
  61.         yyA1 = (phs) - (int)(phs);\
  62.         sig = (amp) * ( (*(F[(fno)]+yyI1)) + \
  63.              ( (*(F[(fno)]+yyI2)) - (*(F[(fno)]+yyI1))) * yyA1)\
  64.     }\
  65.     (phs) += (si);\
  66. }
  67.  
  68.  
  69. #define Oscili(sig, amp, si, fno, phs)\
  70. /* interpolating digital oscillator, negative samp incs ok */\
  71. yyI1 = (int)(phs) + 1;\
  72. yyI2 = (yyI1 % (int)*(F[(fno)])) + 1;\
  73. yyA1 = (phs) - (int)(phs);\
  74. (phs) += (si);\
  75. while ((phs) < 0.0) (phs) += *(F[(fno)]);\
  76. while ((phs) >= (*(F[(fno)]))) (phs) -= *(F[(fno)]);\
  77. sig = (amp) * ( (*(F[(fno)]+yyI1)) + \
  78.  ( (*(F[(fno)]+yyI2)) - (*(F[(fno)]+yyI1))) * yyA1)
  79.  
  80.  
  81. #define Nonlin(sig, amp, x, fno)\
  82. /* interpolating lookup of transfer function for non-linear distortion
  83. *  (waveshaping) */\
  84. yyI1 = (x) + (int)(*(F[(fno)])/2.0) + 1;\
  85. if ( yyI > *(F[(fno)]-1.0)) yyI1 = (int)*(F[(fno)]);\
  86. else if ( yyI1 < 1 ) yyI1 = 1;\
  87. yyI2 = yyI1 + 1;\
  88. yyA1 = (x) - (int)(x);\
  89. sig = (amp) * ( (*(F[(fno)]+yyI1)) + \
  90.  ( (*(F[(fno)]+yyI2)) - (*(F[(fno)]+yyI1))) * yyA1)
  91.  
  92. /*-----------------------------------------------------------------
  93. * Various conversion routines, usually assuming 512 length functions
  94. */
  95.  
  96. #define Cycle(cps)\
  97. /* cps to samp inc */\
  98. ((cps) * 512.0 / srate)
  99.  
  100. #define Sicps(si)\
  101. /* samp inc to cps */\
  102. (((si) * srate) / 512.0)
  103.  
  104. #define Period(dur)\
  105. /* duration to samp inc */\
  106. (512.0 / srate / (dur))
  107.  
  108. #define Pitch(pch)\
  109. /* 8ve.pc to samp inc */\
  110. yyA1 = (int)(pch)\
  111. pow(2.0, ( yyA1 + 8.333333 * (pch - oct) )) * 523.2511 / srate
  112.  
  113. #define Cpsoct(oct)\
  114. /* linear octave form to cps, Mid C = octave 8 */\
  115. pow(2.0, (oct) ) * 1.021975
  116.  
  117. #define Cpspch(pch)\
  118. /* 8ve.pc to cps */\
  119. yyA1 = (int)(pch)\
  120. pow(2.0, ( yyA1 + 8.333333 * (pch - oct) )) * 1.021975
  121.  
  122. #define Octave(oct)\
  123. /* linear octave form to samp inc */\
  124. pow(2.0, (oct) ) * 523.2511 / srate
  125.  
  126. #define Octcps(cps)\
  127. /* cps to linear octave form */\
  128. log( (cps) / 1.021975 ) / 0.69314718
  129.  
  130. #define Octpch(pch)\
  131. /* 8ve.pc to linear octave */\
  132. (int)(pch) + 8.333333 * ((pch) - (int)(pch))
  133.  
  134. #define Pchcps(cps)\
  135. /* cps to 8ve.pc */\
  136. Pchoct( Octcps((cps)) )
  137.  
  138. #define Pchoct(oct)\
  139. /* linear octave form to 8ve.pc */\
  140. 0.12 * ( (oct) - (int)(oct) ) + (int)(oct)
  141.  
  142. /*-----------------------------------------------------------------*/
  143. /*
  144. have to call this dRandom, Mac Toolbox has a function called Random
  145. */
  146.  
  147. #define dRandom(x)\
  148. (double) ((1061 * (int)((x)*1048576.0) + 221589) % 1048576) / 1048576.0
  149.  
  150. #define Rand(sig, amp, a)\
  151. a = dRandom(a);\
  152. sig = (amp) * ( 1.0 - (2.0 * a));
  153.  
  154. #define Randh(sig, amp, si, a)\
  155. *(a) += (si);\
  156. if ( *(a) >= 512.0) {\
  157.     *(a+1) = dRandom(*(a+1));\
  158.     *(a) -= 512.0;\
  159. }\
  160. sig = *(a+1) * (amp)
  161.  
  162. #define Randi(sig, amp, si, a)\
  163. *(a) += (si);\
  164. if ( *(a) > 1.0 )  {\
  165.     *(a) -= 1.0;\
  166.     *(a+1) = *(a+2);\
  167.     *(a+2) = dRandom( *(a+2) );\
  168.     *(a+3) = 2.0 * ( *(a+1) - *(a+2) );\
  169.     *(a+1) = 1.0 - ( *(a+1) * 2.0 ) - (*(a+3) * *(a) );\
  170. }\
  171. sig = ( *(a+1) + *(a+3) * *(a) ) * (amp)
  172.  
  173. #define Randfi(sig, amp, freq, a )\
  174. yyA1 = *(a+3) / (srate / (freq));\
  175. if ( yyA1 >= 1.0) {\
  176.     *(a+3) = 0.0;\
  177.     yyA1 = 0.0;\
  178. }\
  179. if ( *(a+3) == 0.0 ) {\
  180.     *(a+1) += *(a+2);\
  181.     Randf( *(a+2), *(a+1), *(a+4), *(a) ) - *(a+1);\
  182. }\
  183. *(a+3) += 1.0;\
  184. sig = (amp) * ( *(a+1) + ( yyA1 * *(a+2)) )
  185.  
  186.  
  187. #define Randf(sig, oldval, factor, seed)\
  188. yyA1 = 2.0 - ( 2.0 * (factor));\
  189. yyA2 = (oldval) - yyA1;\
  190. if ( yyA2 < -1.0) yyA2 = -1.0;\
  191. yyA3 = (oldval) + yyA1;\
  192. if ( yyA3 > 1.0) yyA3 = 1.0;\
  193. seed = dRandom((seed));\
  194. sig = yyA1 + ((yyA2-yyA1) * (seed))
  195.     
  196. /*-----------------------------------------------------------------*/
  197. #define Envel3(sig, amp, fno, a )\
  198. if ( *(a+3) < 128.0) {\
  199.     *(a+3) += *(a);\
  200.     if (*(a+3) > 128.0) *(a+3) = 128.0;\
  201. }\
  202. else if (*(a+4) < 256.0) {\
  203.     *(a+3) += *(a+1);\
  204.     if (*(a+3) > 256.0) *(a+3) = 256.0;\
  205. }\
  206. else if (*(a+4) < 384.0) {\
  207.     *(a+3) += *(a+2);\
  208.     if (*(a+3) > 384.0) *(a+3) = 384.0;\
  209. }\
  210. else\
  211.     *(a+3) = 384.0;\
  212. yyI1 = (int)(*(a+3) + 1.5);\
  213. sig = (amp) * (*(F[(fno)] + yyI1))
  214.  
  215.  
  216.     
  217.     
  218. /*-----------------------------------------------------------------*/
  219.  
  220. #define Alpass(sig, xin, rvt, a)\
  221. Comb(yyA1, (xin), (rvt), a);\
  222. yyI1 = *(a+4);\
  223. sig = yyA1 - *(a+3) - *(a+yyI1)
  224.  
  225. #define Balnce(sig, y, x, a)\
  226. Tone(yyA1, (y) * (y), (a+3));\
  227. if ( yyA1 == 0.0 ) yyA1 = 0.00000001;\
  228. Tone(yyA2, (x) * (x), a);\
  229. sig = (y) * sqrt( yyA2 ) / yyA1
  230.  
  231. #define Comb(sig, xin, rvt, a)\
  232. if ( rvt != *(a+2)) {\
  233.     if ( rvt == 0.0 ) *(a+3) = 0.0;\
  234.     else *(a+3) = pow(0.001, *(a+1) / rvt );\
  235.     *(a+3) = 0.0;\
  236.     *(a+2) = rvt;\
  237. }\
  238. if ( *(a+4) >= *(a)) *(a+4) = 5.0;\
  239. else *(a+5) += 1;\
  240. yyI1 = (int)*(a+4);\
  241. sig = *(a+yyI1);\
  242. *(a+yyI1) = (*(a+yyI1) * *(a+3)) + (xin)
  243.  
  244.  
  245. /*-----------------------------------------------------------------*/
  246. #define Buzz(sig, amp, si, hn, fno, phs )\
  247. yyI1 = (phs);\
  248. yyI2 = (yyI1+1) % 1024;\
  249. yyA1 = 2.0 * hn;\
  250. yyA2 = yyA1 + 1.0;\
  251. yyA3 = (int)( (phs - (int)phs) * yyA2) / yyA2;\
  252. yyA4 = (*(F[(fno)] + yyI1 + 1));\
  253. yyA5 = (*(F[(fno)] + yyI2 + 1));\
  254. yyA4 +=  (yyA5 - yyA4) * yyA3;\
  255. if ( yyA4 == 0.0 ) sig = (amp);\
  256. else {\
  257.     yyI2 = (int)(yyA2 * (phs)) % 1024;\
  258.     sig = (amp) * ((*(F[(fno)] + yyI2 + 1)) / yyA4 - 1.0) / yyA1;\
  259. }\
  260. (phs) += (si);\
  261. while ((phs) >= 1024.0) (phs) -= 1024.0
  262. /*-----------------------------------------------------------------*/
  263. #define Envlp(sig, amp, nf1, nf2, a )\
  264. yyA1 = Oscil1(sig, (amp), *(a), nf1, *(a+1));\
  265. sig = Oscil1(yyA1, *(a+2), nf2, *(a+3));\
  266. sig += *(a+4)
  267. /*-----------------------------------------------------------------*/
  268.  
  269. #define Add8vepc(res, p1, p2)\
  270.     /* adds together 2 8ve.pc pitches */\
  271.     yyI2 = (int)(p1);\
  272.     yyA1 = (p1) - yyI2;\
  273.     yyI3 = (int)p2;\
  274.     if ( yyI3 < 0 ) {\
  275.         yyI1 = -yyI3;\
  276.         yyA2 = (p2) + (double)yyI1;\
  277.     }\
  278.     else\
  279.         yyA2 = (p2) - (double)yyI3;\
  280.     yyA3 = (yyA1+yyA2) * 100.0;    /* shift for roundoff/truncation */\
  281.     yyI4 = (int)(yyA3/12.0) + yyI2 + yyI3;\
  282.     if ( yyA3 < 0.0 ) {\
  283.         yyI4 -= 1;\
  284.         yyA4 = (12.0 + (int)yyA3 % 12) / 100.0;\
  285.     }\
  286.     else {\
  287.         yyA4 =  ((int)yyA3 % 12) / 100.0;\
  288.     }\
  289.     res = yyI4+yyA4
  290.  
  291. #define Expon(sig, a, b)\
  292.     (*a) *= (*b);\
  293.     sig = (*a)
  294.  
  295.  
  296.  
  297.  
  298. /* not checked out yet */
  299. #define Formnt( sig, rms, si, fno1, fno2, fno3, fno4, a)\
  300.     /* a[0] = overall phase */\
  301.     /* a[1] = previous sum of squares */\
  302.     /* a[2] = rescaling divisor */\
  303.     yyA2 = 0.0;\
  304.     if ( (rms) == 0.0 ) {\
  305.         yyA3 = 0.0;\
  306.         for ( yyI1 = 1; yyI1 < 508; yyI1 += 3 ) {\
  307.             yyA6 = *(F[(fno2)]+yyI1);\
  308.             if ( yyA6 == 0.0 )\
  309.                 break;\
  310.             yyI2 = (int)(yyA6 * (si) * 2.0 + 1.5);\
  311.             if ( yyI2 > 512)\
  312.                 break;\
  313.             yyA5 = *(F[(fno2)]+yyI1+1) * *(F[(fno3)]+yyI2);\
  314.             if ( (fno4) <= 0)\
  315.                 yyA1 = yyA5;\
  316.             else\
  317.                 yyA1 = yyA5 / *(F[(fno4)]+yyI2);\
  318.             yyA2 += (yyA1 * yyA1 );\
  319.             yyI3 = ((int)((yyA6 * *a) + *(F[(fno2)]+yyI1+2)) % 512) + 1.0;\
  320.             yyA3 += yyA5 * *(F[(fno1)]+yyI3);\
  321.         }\
  322.     }\
  323.     yyA4 = (*a+(si));\
  324.     yyA1 = yyA4 / 65536.0;\
  325.     *a = yyA4 - ((int)yyA1 * 65536.0);\
  326.     if ( yyA2 != 0.0 ) {\
  327.         if ( yyA2 != *(a+1)) {\
  328.             *(a+2) = sqrt(yyA2 / 2.0);\
  329.             *(a+1) = yyA2;\
  330.         }\
  331.         else\
  332.             sig = yyA3 * (rms) / *(a+2);\
  333.     }\
  334.     sig = 0.0
  335.  
  336. #define Linens(sig, amp, a)\
  337.     *(a+3) += 1.0;\
  338.     if ( *(a+3) <= *(a)) {\
  339.         *(a+6) += *(a+4);\
  340.         sig = (amp) * *(a+6);\
  341.     }\
  342.     else if ( *(a+3) <= *(a+2)) sig = (amp);\
  343.     else if ( *(a+3) > *(a+2)) {\
  344.         *(a+7) -= *(a+5);\
  345.         sig = (amp) * *(a+7);\
  346.     }\
  347.     else sig = 0.0
  348.  
  349. #define Hpf2(sig, y, a )\
  350. /* 2nd order high pass filter,\
  351. * digital recursion formula parameter assignments:\
  352. * *a = y1, *(a+1) = y2, *(a+2) = z1, *(a+3) = z2, *(a+4) = p0,\
  353. * *(a+5) = q1, *(a+6) = q2.\
  354. */\
  355.     sig = *(a+4) * ( (y)-*a-*a+*(a+1)) + *(a+5) * *(a+2) + *(a+6) * *(a+3);\
  356.     *(a+1) = *a;\
  357.     *a = (y);\
  358.     *(a+3) = *(a+2);\
  359.     *(a+2) = sig
  360.  
  361. #define Randfc(sig, amp, freq, a, curv, cdiff)\
  362.     yyA2 = ((128.0 / srate) * *(a+3) * (freq) );\
  363.     if ( yyA2 > 128.0) {\
  364.         *(a+3) = 0.0;\
  365.         yyA2 = 0;\
  366.     }\
  367.     if ( *(a+3) == 0.0 ) {\
  368.         *(a+1) += *(a+2);\
  369.         Randf(*(a+2), *(a+1), *(a+4), *(a))\
  370.         *(a+2) -= *(a+1);\
  371.     }\
  372.     *(a+3) += 1.0;\
  373.     yyI1 = (int)yyA2;\
  374.     yyA1 = *(curv+yyI1) + (*(cdiff+yyI1) * ( yyA2 - yyI1));\
  375.     sig = (amp) * ( *(a+1) + ( yyA1 * *(a+2))))\
  376.  
  377. #define Reson( x, a )\
  378. /* y[i] = a[0] * x[i] + a[1] * y[i-1] - a[2] * y[i-2] */\
  379.     yyA1 = *a * (x) + *(a+1) * *(a+3) - *(a+2) * *(a+4);\
  380.     *(a+4) = *(a+3);\
  381.     *(a+3) = yyA1;\
  382.     sig = yyA1\
  383.  
  384. #define Slope(sig, a, b)\
  385.     (*a) += (*b);\
  386.     sig = (*a)
  387.  
  388. #define Tone(sig, x, a )\
  389.     *(a+2) = (*(a) * (x)) + (*(a+1) * *(a+2));\
  390.     sig = *(a+2)
  391.  
  392. #define Vreson(sig, xin, cf, bw, fl, fno, a)\
  393.     yyA2 = 1.0 - 3.1415926 * (bw) / srate;\
  394.     *(a+2) = yyA2 * yyA2;\
  395.     yyA2 = 4.0 * *(a+2) / (1.0 + *(a+2));\
  396.     yyA1 = (fl) * (cf) / srate;\
  397.     Vfmult(*(a+1), yyA2, yyA1, (fno));\
  398.     Reson(sig, (xin), a))
  399.  
  400. #define Vfmult(sig, amp, sl, fno)\
  401.     yyI1 = ((int)(sl) % (int)*(F[(fno)])) + 1;\
  402.     sig = (amp) * *(F[(fno)] + yyI1)
  403.  
  404. #define Ilook(sig, x, fno)\
  405. /* interpolating table lookup */\
  406.     yyI1 = (int)(x);\
  407.     if ( yyI1 < 1 ) sig = (*(F[(fno)] + 1));\
  408.     else if (yyI1 >= (int)*(F[(fno)])) sig = (*(F[(fno)] + *(F[(fno)])));\
  409.     else {\
  410.         yyI2 = yyI1 + 1;\
  411.         yyA1 = (x) - yyI1;\
  412.         sig = (*(F[(fno)]+yyI1)) + \
  413.          ( (*(F[(fno)]+yyI2)) - (*(F[(fno)]+yyI1))) * yyA1;\
  414.     }
  415.         
  416.  
  417.  
  418.  
  419. #define Sdelay(sig, delay_len, buflen, buf, bufptr)\
  420.     yyA2 = (*bufptr) - (delay_len);\
  421.     if ( yyA2 < 0.0 ) yyA2 += (buflen);\
  422.     yyI1 = (int)yyA2;\
  423.     yyI2 = yyI1 % (buflen);\
  424.     yyA1 = yyA2 - (int)yyA2;\
  425.     sig =  *(buf+yyI1) + ( (*(buf+yyI2) - *(buf+yyI1)) * yyA1 )
  426.  
  427.  
  428. #define Zdelay(sig, sigin, delay_len, buflen, buf, bufptr)\
  429.     yyI2 = (int)(*bufptr);\
  430.     if ( yyI2 > (buflen)) {\
  431.         (*bufptr) = 0.0;\
  432.         yyI2 = 0;\
  433.     }\
  434.     *(buf+yyI2) = sigin;\
  435.     yyA2 = (*bufptr) - (delay_len);\
  436.     yyI1 = (int)yyA2;\
  437.     yyI3 = yyI1 % (buflen);\
  438.     yyA1 = yyA2 - (int)yyA2;\
  439.     sig = *(buf+yyI1) + ( (*(buf+yyI3) - *(buf+yyI1)) * yyA1 )
  440.  
  441.  
  442. #define Reverb(sig, xin, rvt, a )\
  443. /* after Schroeder */\
  444. /* dimension for "a" is (30 + 1538 * srate / 10000) - 1 */\
  445.     yyA1 = 0.0;\
  446.     yyA2 = 0.0;\
  447.     yyI2 = 0;\
  448.     for ( yyI1 = 0; yyI1 < 4; yyI1++ ) {\
  449.         Comb(yyA2, (xin), (rvt), a+yyI2 );\
  450.         yyA1 += yyA2;\
  451.         yyA2 = yyA1;\
  452.         yyI2 += (int)*(a+yyI2);\
  453.     }\
  454.     Alpass(yyA1, 0.096835, a+yyI2) * 0.25;\
  455.     yyI2 += (int)*(a+yyI2);\
  456.     Alpass(yyA1, 0.32924, a+yyI2);\
  457.     sig = yyA1\
  458.  
  459.  
  460. /*-------------------------------------------------------------------------------*/
  461.  
  462.